package com.neuedu.corejava.ch13.homework;

/**
 * 没有线程同步的实例：可能有多个线程对统一资源进行访问，可能造成数据共享问题
 * 
 * 代码块锁只是锁定特定的代码块：方法锁是控制整个对象的，会对所有线程起作用；
 * @author admin
 */

public class HomeWork4 {
	private static final Object Locked1 = new Object();  //只要是Object类或其它子类都可以作为一把锁
	private static final Object Locked2 = new Object();  //注意：在程序中可能有多把锁，需要同一个资源进行锁定（同步），必须使用同一把锁
	private int count = 0;
	
	public void add(int ThreadId){
		//代码块锁，可以使用一个对象锁定一个代码块，在代码块中控制对某个资源的共享
		//如何加锁：对有线程共享安全的数据进行加锁，使用方法锁或代码块锁
		synchronized (Locked1) {
			count++;
			System.out.println(ThreadId+":"+count);
		}
	}
	public void desc(int ThreadId){
		synchronized (Locked2) {
			count--;
			System.out.println(ThreadId+":"+count);
		}
	}
	
	class AddClass implements Runnable{
		private int ThreadId = 0;
		
		public AddClass(int id) {
			this.ThreadId = id;
		}
		
		@Override
		public void run() {
			for (int i = 0; i < 50; i++) {
				add(ThreadId);
				System.out.println(ThreadId+":"+count);
				/*try {
					Thread.sleep(100);
				} catch (Exception e) {
					// TODO: handle exception
				}*/
			}
		}
		
	}
	
	//内部类实现接口
	class DescClass implements Runnable{
		private int ThreadId = 0;
		
		public DescClass(int id) {
			this.ThreadId = id;
		}
		
		@Override
		public void run() {
			for (int i = 0; i < 50; i++) {
				desc(ThreadId);
				/*try {
					Thread.sleep(100);
				} catch (Exception e) {
					// TODO: handle exception
				}*/
			}
		}
		
	}
	
	
	
	public static void main(String[] args) {
		HomeWork4 homeWork4 = new HomeWork4();
		
		AddClass addClass1 = homeWork4.new AddClass(1);
		AddClass addClass2 = homeWork4.new AddClass(2);
		
		DescClass descClass1 = homeWork4.new DescClass(3);
		DescClass descClass2 = homeWork4.new DescClass(4);
		
		new Thread(addClass1).start();
		new Thread(addClass2).start();
		new Thread(descClass1).start();
		new Thread(descClass2).start();
		
	}
	

}
